<?php
/**
 * @package    system
 * @subpackage service
 */
class ServiceValidationException extends ServiceException{
  private $errors = array();
  
  function __construct($message, $code, $errors) {
    parent::__construct($message,$code);
    $this->errors = $errors;
  }
  
  static function buildWithOneError($property,$message,$type) {
    $errors = array();
    $er = array();
    $er['property'] = $property;
    $er['message'] = $message;
    $er['type'] = $type;
    $errors[] = $er;
    return new ServiceValidationException($message,0,$errors);
  }
  
  /**
   * @return array
   */
  function getErrors() {
    return $this->errors;
  }

  function removeError($k) {
    unset($this->errors[$k]);
  }
  
  /**
   * @return boolean
   */
  function hasError() {
    return count($this->errors);
  }
  
  /**
   * @return boolean
   */
  function hasErrorOnProperty($propertyName) {
    foreach ($this->errors as $error) {
      if($error['property'] == $propertyName) return true;
    }
    return false;
  }
  

  /**
   * Este método troca as mensagens de erro presentes nessa exceção para mostrar para o usuário.
   * Se o erro não existir, não faz nada.
   * 
   * @param string $fieldName
   * @param string $errorType o tipo de erro para o qual a mensagem deve ser trocada. Uma constante de JsonSchema.
   * @param string $newMessage A mensagem nova
   * @return unknown
   */
  function switchMessage($fieldName,$errorType,$newMessage) {
    foreach ($this->errors as &$error) { 
      if(
        $error['property'] == $fieldName 
        && $error['type'] == $errorType
      )  {
        $error['message'] = $newMessage; 
      }
    }
  }
}
?>